#!/usr/bin/env node

/**
 * VitePress CMS 自动同步脚本
 * 从 API 获取数据并自动生成/更新 Markdown 文件
 */

import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const rootDir = resolve(__dirname, '..')

// 读取配置
const configPath = resolve(rootDir, 'cms.config.json')
let config = {}

if (existsSync(configPath)) {
  try {
    const configContent = readFileSync(configPath, 'utf-8')
    config = JSON.parse(configContent)
  } catch (error) {
    console.error('❌ 读取配置文件失败:', error.message)
    process.exit(1)
  }
} else {
  console.warn('⚠️  配置文件不存在，使用默认配置')
  config = {
    apiUrl: process.env.CMS_API_URL || '',
    apiKey: process.env.CMS_API_KEY || '',
    endpoints: {
      articles: '/api/articles',
      cases: '/api/cases'
    },
    outputDir: 'lawyerch.cn'
  }
}

/**
 * 从 API 获取数据
 */
async function fetchFromAPI(endpoint, options = {}) {
  const { apiUrl, apiKey, responseFormat } = config
  const url = `${apiUrl}${endpoint}`
  
  const headers = {
    'Content-Type': 'application/json',
    ...(apiKey && { 'Authorization': `Bearer ${apiKey}` }),
    ...options.headers
  }

  try {
    console.log(`📡 正在获取数据: ${url}`)
    const response = await fetch(url, {
      method: options.method || 'GET',
      headers,
      ...options
    })

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`)
    }

    const result = await response.json()
    
    // 支持自定义响应格式
    if (responseFormat) {
      const { dataPath, codePath, successCode } = responseFormat
      const code = codePath ? result[codePath] : 200
      
      if (code !== (successCode || 200)) {
        throw new Error(`API 返回错误: ${result.msg || result.message || '未知错误'}`)
      }
      
      const data = dataPath ? result[dataPath] : result
      console.log(`✅ 获取成功，共 ${Array.isArray(data) ? data.length : 1} 条数据`)
      return data
    }
    
    // 默认格式：直接返回数组或对象
    console.log(`✅ 获取成功，共 ${Array.isArray(result) ? result.length : 1} 条数据`)
    return result
  } catch (error) {
    console.error(`❌ 获取数据失败: ${error.message}`)
    throw error
  }
}

/**
 * 生成文章 Markdown 内容
 */
function generateArticleMarkdown(article) {
  const frontmatter = {
    title: article.title || '未命名文章',
    description: article.description || article.excerpt || '',
    date: article.publishedAt || article.createdAt || new Date().toISOString().split('T')[0],
    ...(article.tags && { tags: article.tags }),
    ...(article.category && { category: article.category })
  }

  const frontmatterStr = Object.entries(frontmatter)
    .map(([key, value]) => {
      if (Array.isArray(value)) {
        return `${key}:\n${value.map(v => `  - ${v}`).join('\n')}`
      }
      return `${key}: ${value}`
    })
    .join('\n')

  return `---
${frontmatterStr}
---

${article.content || article.body || ''}
`
}

/**
 * 生成案例 Markdown 内容
 */
function generateCaseMarkdown(caseItem) {
  const frontmatter = {
    title: caseItem.title || '未命名案例',
    description: caseItem.description || caseItem.summary || '',
    date: caseItem.date || caseItem.createdAt || new Date().toISOString().split('T')[0],
    ...(caseItem.category && { category: caseItem.category }),
    ...(caseItem.tags && { tags: caseItem.tags })
  }

  const frontmatterStr = Object.entries(frontmatter)
    .map(([key, value]) => {
      if (Array.isArray(value)) {
        return `${key}:\n${value.map(v => `  - ${v}`).join('\n')}`
      }
      return `${key}: ${value}`
    })
    .join('\n')

  let content = caseItem.content || caseItem.body || ''
  
  if (caseItem.analysis) {
    content += `\n\n## 案例分析\n\n${caseItem.analysis}\n`
  }
  
  if (caseItem.conclusion) {
    content += `\n\n## 案例启示\n\n${caseItem.conclusion}\n`
  }

  return `---
${frontmatterStr}
---

${content}
`
}

/**
 * 更新文章列表页面
 */
function updateArticlesList(articles) {
  const outputPath = resolve(rootDir, config.outputDir || 'lawyerch.cn', 'articles.md')
  
  // 按分类分组
  const categories = {
    '法律实务': articles.filter(a => a.category === '法律实务' || a.category === 'practice'),
    '法律文书': articles.filter(a => a.category === '法律文书' || a.category === 'document'),
    '法律法规政策': articles.filter(a => a.category === '法律法规政策' || a.category === 'regulation'),
    '法律与AI': articles.filter(a => a.category === '法律与AI' || a.category === 'ai'),
    '法律资讯': articles.filter(a => a.category === '法律资讯' || a.category === 'news')
  }

  let content = `---
title: 法律专业文章-法律实务|法律文书|法规政策|法律与AI
description: 陈恒律师专业文章合集，包含法律实务、法律文书模板、法律法规政策、法律与AI应用等专业内容。
head:
  - - meta
    - name: keywords
      content: 法律文章,法律实务,法律文书模板,法律法规,起诉状模板,答辩状模板,法律案例分析,法律AI应用
---

# 专业文章

分享法律知识，解读法律实务，帮助您更好地理解和运用法律。

---

## 📚 文章专栏

以下是我在微信公众号发布的系列文章合集，涵盖法律实务、文书模板、法规政策等多个专业领域。

`

  // 生成各分类内容
  Object.entries(categories).forEach(([categoryName, categoryArticles]) => {
    if (categoryArticles.length === 0) return

    const emoji = {
      '法律实务': '📖',
      '法律文书': '📝',
      '法律法规政策': '📋',
      '法律与AI': '🤖',
      '法律资讯': '📰'
    }[categoryName] || '📄'

    content += `### ${emoji} ${categoryName}\n\n`
    content += `${categoryName === '法律实务' ? '专注实务操作指导，分享真实案例分析与法律适用要点。' : ''}\n`
    content += `${categoryName === '法律文书' ? '精心整理的各类法律文书模板与写作指引，助力高效办案。' : ''}\n`
    content += `${categoryName === '法律法规政策' ? '及时更新最新法律法规、司法解释与政策文件。' : ''}\n`
    content += `${categoryName === '法律与AI' ? '探索人工智能在法律服务领域的应用与实践。' : ''}\n`
    content += `${categoryName === '法律资讯' ? '关注法律行业动态与热点事件。' : ''}\n\n`

    content += `<div class="article-collection">
  <div class="collection-info">
    <span class="collection-count">${categoryArticles.length}篇内容</span>
    <span class="collection-desc">${categoryArticles[0].categoryDescription || '专业内容持续更新中'}</span>
  </div>
  ${categoryArticles[0].link ? `<a href="${categoryArticles[0].link}" target="_blank" class="collection-link">
    查看全部文章 →
  </a>` : ''}
</div>\n\n`

    if (categoryArticles.length > 0) {
      content += `**${categoryName === '法律实务' ? '精选' : categoryName === '法律文书' ? '包含' : '重要'}${categoryName === '法律资讯' ? '' : '内容'}：**\n`
      categoryArticles.slice(0, 10).forEach(article => {
        content += `- ${article.title}`
        if (article.link) {
          content += ` [查看原文](${article.link})`
        }
        content += '\n'
      })
      if (categoryArticles.length > 10) {
        content += `- ... 还有 ${categoryArticles.length - 10} 篇内容\n`
      }
    }

    content += '\n---\n\n'
  })

  content += `## ✍️ 文章订阅

关注我的微信公众号"陈恒律师日志"，第一时间接收法律文章推送：

::: tip 订阅方式
扫描网站首页二维码关注公众号，每周获取精选法律文章、实务技巧与最新法规政策。
:::

---

## 📬 投稿与建议

如果您对某个法律问题特别关注，欢迎留言或通过公众号联系我。

我会根据大家的需求，选择合适的主题撰写文章。
`

  writeFileSync(outputPath, content, 'utf-8')
  console.log(`✅ 已更新文章列表: ${outputPath}`)
}

/**
 * 更新新闻列表页面
 */
function updateNewsList(newsItems) {
  const outputPath = resolve(rootDir, config.outputDir || 'lawyerch.cn', 'news.md')
  
  // 按日期排序（最新的在前）
  const sortedNews = [...newsItems].sort((a, b) => {
    const dateA = new Date(a.focus_date || a.date || 0)
    const dateB = new Date(b.focus_date || b.date || 0)
    return dateB - dateA
  })

  let content = `---
title: 今日新闻-最新法律资讯|法律热点|法治动态
description: 最新法治新闻资讯，包含法律热点、法治动态、政策解读等权威法律信息。
head:
  - - meta
    - name: keywords
      content: 今日新闻,法律资讯,法律热点,法治动态,法律政策
---

# 今日新闻

最新法治新闻资讯，关注法律热点，了解法治动态。

---

## 📰 最新资讯

<div class="article-collection">
  <div class="collection-info">
    <span class="collection-count">${sortedNews.length}条新闻</span>
    <span class="collection-desc">每日更新最新法治新闻与法律资讯</span>
  </div>
</div>

---

<style>
.news-image-container {
  width: 100%;
  margin: 20px 0;
  text-align: center;
  overflow: hidden;
  border-radius: 8px;
  background: var(--vp-c-bg);
}

.news-image {
  width: 100%;
  max-width: 100%;
  height: auto;
  display: block;
  margin: 0 auto;
  object-fit: cover;
}

.news-brief {
  color: var(--vp-c-text-2);
  line-height: 1.8;
  margin: 16px 0;
  font-size: 15px;
}

.news-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  margin: 16px 0;
  font-size: 14px;
  color: var(--vp-c-text-2);
}

.news-date {
  display: flex;
  align-items: center;
  gap: 4px;
}

.news-keywords {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

.keyword-tag {
  display: inline-block;
  padding: 4px 10px;
  background: var(--vp-c-brand-soft);
  color: var(--vp-c-brand-1);
  border-radius: 12px;
  font-size: 12px;
  font-weight: 500;
}

.news-link-btn {
  display: block;
  width: 100%;
  margin-top: 20px;
  padding: 14px 24px;
  background: var(--vp-c-brand-1);
  color: white !important;
  text-decoration: none !important;
  text-align: center;
  border-radius: 8px;
  font-size: 16px;
  font-weight: 600;
  transition: all 0.3s ease;
  box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3);
}

.news-link-btn:hover {
  background: var(--vp-c-brand-3);
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
}

/* 标题链接样式 */
.news-title-link {
  color: var(--vp-c-text-1);
  text-decoration: none;
  transition: color 0.3s ease;
}

.news-title-link:hover {
  color: var(--vp-c-brand-1);
}

/* 暗色模式适配 */
.dark .keyword-tag {
  background: rgba(59, 130, 246, 0.2);
  color: var(--vp-c-brand-2);
}

/* 响应式设计 */
@media (max-width: 768px) {
  .news-link-btn {
    padding: 12px 20px;
    font-size: 15px;
  }
}
</style>

`

  sortedNews.forEach((news, index) => {
    const date = news.focus_date ? news.focus_date.split(' ')[0] : news.date || ''
    const time = news.focus_date ? news.focus_date.split(' ')[1] : ''
    const keywords = news.keywords ? news.keywords.split(/\s+/).filter(k => k) : []
    
    content += `### ${index + 1}. <a href="${news.url || '#'}" target="_blank" rel="noopener noreferrer" class="news-title-link">${news.title}</a>

${news.image ? `<div class="news-image-container">
  <img src="${news.image}" alt="${news.title}" class="news-image" loading="lazy" />
</div>` : ''}

${news.brief ? `<div class="news-brief">${news.brief}</div>` : ''}

<div class="news-meta">
  <div class="news-date">
    <span>📅</span>
    <span>${date}${time ? ` ${time}` : ''}</span>
  </div>
  ${keywords.length > 0 ? `<div class="news-keywords">
    <span>🏷️</span>
    ${keywords.slice(0, 5).map(k => `<span class="keyword-tag">${k}</span>`).join('')}
  </div>` : ''}
</div>

${news.url ? `<a href="${news.url}" target="_blank" rel="noopener noreferrer" class="news-link-btn">查看原文 →</a>` : ''}

---
`
  })

  content += `## 📬 订阅更新

关注我的微信公众号"陈恒律师日志"，第一时间接收法律资讯推送。

::: tip 订阅方式
扫描网站首页二维码关注公众号，每日获取最新法治新闻与法律热点。
:::
`

  writeFileSync(outputPath, content, 'utf-8')
  console.log(`✅ 已更新新闻列表: ${outputPath}`)
}

/**
 * 更新案例列表页面
 */
function updateCasesList(cases) {
  const outputPath = resolve(rootDir, config.outputDir || 'lawyerch.cn', 'cases.md')
  
  let content = `---
title: 成功案例-行政复议|行政诉讼|民商事纠纷
description: 陈恒律师成功案例分享，包含行政复议、行政诉讼、民商事纠纷等各类案件的专业分析与法律启示。
head:
  - - meta
    - name: keywords
      content: 法律案例,行政复议案例,行政诉讼案例,民商事纠纷案例,法律案例分析
---

# 成功案例

真实案例分享，专业法律分析，为您提供参考与启示。

---

## 📋 案例分类

`

  // 按分类分组
  const categories = {
    '行政复议': cases.filter(c => c.category === '行政复议' || c.category === 'administrative-review'),
    '行政诉讼': cases.filter(c => c.category === '行政诉讼' || c.category === 'administrative-litigation'),
    '民商事纠纷': cases.filter(c => c.category === '民商事纠纷' || c.category === 'civil-dispute')
  }

  Object.entries(categories).forEach(([categoryName, categoryCases]) => {
    if (categoryCases.length === 0) return

    const emoji = {
      '行政复议': '📝',
      '行政诉讼': '⚖️',
      '民商事纠纷': '💼'
    }[categoryName] || '📄'

    content += `### ${emoji} ${categoryName}\n\n`
    content += `<div class="article-collection">
  <div class="collection-info">
    <span class="collection-count">${categoryCases.length}个案例</span>
    <span class="collection-desc">${categoryName}相关案例分析与法律启示</span>
  </div>
</div>\n\n`

    if (categoryCases.length > 0) {
      categoryCases.slice(0, 5).forEach(caseItem => {
        const slug = caseItem.slug || caseItem.id || caseItem.title?.toLowerCase().replace(/\s+/g, '-')
        content += `- [${caseItem.title}](./cases/${slug})\n`
      })
      if (categoryCases.length > 5) {
        content += `- ... 还有 ${categoryCases.length - 5} 个案例\n`
      }
    }

    content += '\n---\n\n'
  })

  writeFileSync(outputPath, content, 'utf-8')
  console.log(`✅ 已更新案例列表: ${outputPath}`)
}

/**
 * 保存单个文章/案例文件
 */
function saveContentFile(type, item, baseDir) {
  const slug = item.slug || item.id || item.title?.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '')
  const defaultBaseDir = type === 'article' ? 'articles' : 'cases'
  const dir = resolve(rootDir, config.outputDir || 'lawyerch.cn', baseDir || defaultBaseDir)
  
  if (!existsSync(dir)) {
    mkdirSync(dir, { recursive: true })
  }

  const filePath = resolve(dir, `${slug}.md`)
  const content = type === 'article' 
    ? generateArticleMarkdown(item)
    : generateCaseMarkdown(item)

  writeFileSync(filePath, content, 'utf-8')
  console.log(`  ✓ ${slug}.md`)
}

/**
 * 主函数
 */
async function main() {
  console.log('🚀 开始同步 CMS 数据...\n')

  try {
    const { endpoints } = config

    // 同步文章
    if (endpoints?.articles) {
      console.log('\n📰 同步文章数据...')
      const articles = await fetchFromAPI(endpoints.articles)
      
      if (Array.isArray(articles) && articles.length > 0) {
        // 更新文章列表
        updateArticlesList(articles)
        
        // 保存单个文章文件（可选，如果需要单独页面）
        if (config.saveIndividualFiles !== false) {
          console.log('💾 保存文章文件...')
          articles.forEach(article => {
            saveContentFile('article', article, 'articles')
          })
        }
      }
    }

    // 同步案例
    if (endpoints?.cases) {
      console.log('\n⚖️  同步案例数据...')
      const cases = await fetchFromAPI(endpoints.cases)
      
      if (Array.isArray(cases) && cases.length > 0) {
        // 更新案例列表
        updateCasesList(cases)
        
        // 保存单个案例文件
        if (config.saveIndividualFiles !== false) {
          console.log('💾 保存案例文件...')
          cases.forEach(caseItem => {
            saveContentFile('case', caseItem, 'cases')
          })
        }
      }
    }

    // 同步新闻
    if (endpoints?.news) {
      console.log('\n📰 同步新闻数据...')
      const news = await fetchFromAPI(endpoints.news)
      
      if (Array.isArray(news) && news.length > 0) {
        // 更新新闻列表
        updateNewsList(news)
        
        // 保存单个新闻文件（可选）
        if (config.saveIndividualFiles === true) {
          console.log('💾 保存新闻文件...')
          news.forEach(newsItem => {
            const slug = newsItem.id || newsItem.title?.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]/g, '')
            const dir = resolve(rootDir, config.outputDir || 'lawyerch.cn', 'news')
            if (!existsSync(dir)) {
              mkdirSync(dir, { recursive: true })
            }
            const filePath = resolve(dir, `${slug}.md`)
            const date = newsItem.focus_date ? newsItem.focus_date.split(' ')[0] : newsItem.date || ''
            const keywords = newsItem.keywords ? newsItem.keywords.split(/\s+/).filter(k => k) : []
            
            const content = `---
title: ${newsItem.title}
description: ${newsItem.brief || ''}
date: ${date}
${keywords.length > 0 ? `tags:\n${keywords.map(k => `  - ${k}`).join('\n')}` : ''}
---

${newsItem.image ? `![${newsItem.title}](${newsItem.image})\n\n` : ''}${newsItem.brief || ''}

${newsItem.url ? `<a href="${newsItem.url}" target="_blank">查看原文</a>` : ''}
`
            writeFileSync(filePath, content, 'utf-8')
            console.log(`  ✓ ${slug}.md`)
          })
        }
      }
    }

    console.log('\n✅ CMS 数据同步完成！')
  } catch (error) {
    console.error('\n❌ 同步失败:', error.message)
    process.exit(1)
  }
}

// 运行主函数
main()

